package com.vanysoft.framework.utils.file;

import com.vanysoft.common.utils.string.StringUtil;
import com.vanysoft.framework.messagesource.MessageCodeConstant;
import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.*;


/**
 * 类名称：MultipartFileUtil
 * 类描述：文件保存工具类（org.springframework.web.multipart.MultipartFile）
 * 创建人：SharpClaw_x
 * 创建时间：2017年5月27日 上午11:38:44
 * 修改人：SharpClaw_x
 * 修改时间：2017年5月27日 上午11:38:44
 * 版本信息：@version 1.0
 * Copyright (c) 2017SharpClaw-版权所有
 * 修改备注：
 */
public class MultipartFileUtil {


    private static final Logger log = LoggerFactory.getLogger(MultipartFileUtil.class);

    /**
     * Function Name               saveFile
     *
     * @param fileByte
     * @param fileDest
     * @throws FileException
     * @description 保存文件
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 下午4:06:33           SharpClaw_x                     Initial
     * *********************************************************************
     */
    public static void saveFile(byte[] fileByte, String fileDest) throws FileException {
        // 格式化文件保存路径
        fileDest = FilePathUtil.getRealFilePath(fileDest);

        // 保存文件到当前操作系统中
        File file = new File(fileDest);
        try {
            FileUtils.writeByteArrayToFile(file, fileByte);
            log.debug("Save File [" + fileDest + "]");
        } catch (IOException e) {
            e.printStackTrace();
            throwException("IO exception", e);
        }
    }

    /**
     * Function Name               saveFile
     *
     * @param multipartFile 文件
     * @param fileDest      文件保存全路径
     * @throws FileException
     * @throws IOException
     * @description 保存文件
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 下午2:27:18           SharpClaw_x                     Initial
     * *********************************************************************
     */
    public static void saveMultipartFile(MultipartFile multipartFile, String fileDest) throws FileException {
        if (null == multipartFile || StringUtil.isEmpty(fileDest)) {
            throwException("function parameter can not be null !");
        }

        if (multipartFile.isEmpty()) {
            throwException("file can not be empty");
        }

        try {
            saveFile(multipartFile.getBytes(), fileDest);
        } catch (IOException e) {
            e.printStackTrace();
            throwException("IO exception", e);
        }

    }

    /**
     * Function Name               saveFiles
     *
     * @param multipartFileMap
     * @param fileBaseFolder
     * @return
     * @throws FileException
     * @description 批量保存文件
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 下午3:00:55           SharpClaw_x                     Initial
     * *********************************************************************
     */
    public static List<String> saveMultipartFiles(Map<String, MultipartFile> multipartFileMap, String fileBaseFolder) throws FileException {
        if (null == multipartFileMap || StringUtil.isEmpty(fileBaseFolder)) {
            throwException("function parameter can not be null !");
        }

        List<String> fileNameList = new ArrayList<>(); // 返回的文件名称list

        Set<String> fileInputNameSet = new HashSet<>();
        if (null != multipartFileMap) {
            fileInputNameSet = multipartFileMap.keySet(); // 文件上传控件中的input标签的name属性值

            for (String fileInputName : fileInputNameSet) {
                MultipartFile multipartFile = multipartFileMap.get(fileInputName);

                if (multipartFile.isEmpty()) {
                    fileNameList.add(null);
                    continue;
                }
                String fileName = UUID.randomUUID().toString() + getFileType(multipartFile);
                saveMultipartFile(multipartFile, fileBaseFolder + "/" + fileName);

                fileNameList.add(fileName);

            }
        }

        return fileNameList;
    }

    /**
     * Function Name               getFileType
     *
     * @param file
     * @return
     * @throws FileException
     * @description 获取文件类型
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 下午2:27:58           SharpClaw_x                     Initial
     * *********************************************************************
     */
    public static String getFileType(MultipartFile file) throws FileException {
        if (null == file) {
            throwException("function parameter can not be null !");
        }

        if (file.isEmpty()) {
            throwException("file can not be empty");
        }

        String originalFilename = file.getOriginalFilename();
        String fileType = originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length());

        return fileType;
    }


    /**
     * Function Name               throwException
     *
     * @param errorMsg
     * @throws FileException
     * @description 抛出异常
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 下午2:00:56           SharpClaw_x                     Initial
     * *********************************************************************
     */
    private static void throwException(String errorMsg) throws FileException {
        throw new FileException(MessageCodeConstant.RTN_CODE_UNKNOW_ERROR, errorMsg);
    }

    /**
     * Function Name               throwException
     *
     * @param errorMsg
     * @param exception
     * @throws FileException
     * @description 抛出异常
     * Modify History:              Date             Programmer       Notes
     * ---------        ---------------  ---------
     * 2017年5月27日 下午2:01:12           SharpClaw_x                     Initial
     * *********************************************************************
     */
    public static void throwException(String errorMsg, Exception exception) throws FileException {
        throw new FileException(MessageCodeConstant.RTN_CODE_UNKNOW_ERROR, errorMsg, exception.getCause());
    }
}
